package cn.darkhorse.mesadmin.task;

import cn.darkhorse.device.dao.HistoryDataDao;
import cn.darkhorse.device.dao.IotElectricityDao;
//import cn.darkhorse.mesmeter.pojo.MesMeter;
//import cn.darkhorse.mesmeter.pojo.MesMeterHistoryDataDay;
//import cn.darkhorse.mesmeter.pojo.MeterMaxid;
//import cn.darkhorse.mesmeter.service.MesMeterHistoryDataDayService;
//import cn.darkhorse.mesmeter.service.MesMeterService;
//import cn.darkhorse.mesmeter.service.MeterMaxidService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
//
///**
// * 计算每日每月电量
// * @author yuanjun
// * @since 2023-08-29
// */
//@Component("meterTask")
public class IotElectricityTask {
//    /**
//     * 总电能对应的字段名称
//     */
//    public static final String FIELD_WH = "Q";
//
//    private Logger logger = LoggerFactory.getLogger("meterTaskLogger");
//
//    @Resource
//    private MesMeterService mesMeterService;
//    @Resource
//    private MesMeterHistoryDataDayService mesMeterHistoryDataDayService;
//    @Resource
//    private MeterMaxidService meterMaxidService;
//
//    @Resource
//    private HistoryDataDao historyDataDao;
//    @Resource
//    private IotElectricityDao iotElectricityDao;
//    /**
//     * 计算某日用电量数据
//     *
//     */
////    @Scheduled(cron = "0/10 * * * * *")
//    public void calculateKwh4Day() {
//        logger.debug("开始计算用电量" + LocalDateTime.now());
//        String today = DateUtils.getDate();
//
//        Set<String> tableNameSet = getAllTableName();
//        // Step.0 获取所有电表信息
//        List<MesMeter> meters = mesMeterService.list();
//        // Step.1 循环查找每块表新上传的数据
//        meters.forEach(meter -> {
//            String tableName = meter.getMeterHistoryTableName();
//            if (StringUtils.isEmpty(tableName)) {
//                // 未设置历史数据表，直接返回
//                return;
//            }
//            System.out.println(String.format("tableName: %s, 是否存在历史表：%s",tableName, tableNameSet.contains(tableName)));
//            if(tableNameSet.contains(tableName)) {
//                // 获取所有需要处理的日期
//                List<String> allDate = getAllDate(tableName, today);
//                if (allDate.size() == 0) {
//                    return;
//                }
//
//                allDate.forEach(date-> {
//                    saveHistoryData(date, tableName, meter);
//                });
//            }
//        });
//        logger.debug("结束计算用电量" + LocalDateTime.now());
//    }
//
//    /**
//     * 计算每日的电量后，保存或更新电量信息
//     * @param date
//     * @param tableName
//     * @param meter
//     */
//    private void saveHistoryData(String date, String tableName, MesMeter meter) {
//        LocalDate localDate = LocalDate.parse(date);
//        List<Map<String, Object>> list = iotElectricityDao.getSaveHistoryData(FIELD_WH,tableName,date);
//
//        BigDecimal startKwh = getInitialWh(date, tableName);
//        BigDecimal endKwh = BigDecimal.ZERO;
//
//        if (startKwh == null) {
//            // 没有期初值不用继续计算
//            return;
//        }
//
//        if (list.size() == 0) {
//            // 如果没有date日期的数据，则认为本日没有用电量。获取跟本日最接近的数据作为期初和期末电能，用电量为0
//            endKwh = startKwh;
//        }else {
//            // 获取本日最后一条数据作为期末电量
//            Map<String, Object> lastData = list.get(list.size() - 1);
//            endKwh = new BigDecimal(lastData.get(FIELD_WH).toString());
//            saveLastId(tableName, Long.parseLong(lastData.get("id").toString()));
//        }
//
//
//        // 保存历史用电信息
//        MesMeterHistoryDataDay mesMeterHistoryDataDay = new MesMeterHistoryDataDay();
//        mesMeterHistoryDataDay.setMeterId(meter.getId());
//        mesMeterHistoryDataDay.setMeterName(meter.getMeterName());
//        mesMeterHistoryDataDay.setElectricityId(meter.getElectricityId());
//        mesMeterHistoryDataDay.setElectricityName(meter.getElectricityName());
//        mesMeterHistoryDataDay.setElectricityType(meter.getElectricityType());
//        mesMeterHistoryDataDay.setYears(String.valueOf(localDate.getYear()));
//        mesMeterHistoryDataDay.setMonths(String.valueOf(localDate.getMonthValue()));
//        mesMeterHistoryDataDay.setDays(String.valueOf(localDate.getDayOfMonth()));
//        mesMeterHistoryDataDay.setCreatedDate(date);
//        mesMeterHistoryDataDay.setStartKwh(startKwh);
//        mesMeterHistoryDataDay.setEndKwh(endKwh);
//        mesMeterHistoryDataDay.setKwh(endKwh.subtract(startKwh));
//
//        List<MesMeterHistoryDataDay> historyDatas = mesMeterHistoryDataDayService.list(new LambdaQueryWrapper<MesMeterHistoryDataDay>()
//                .eq(MesMeterHistoryDataDay::getMeterId, meter.getId())
//                .eq(MesMeterHistoryDataDay::getCreatedDate, date));
//
//        if (historyDatas.size() == 0) {
//            mesMeterHistoryDataDayService.save(mesMeterHistoryDataDay);
//        }else {
//            mesMeterHistoryDataDay.setId(historyDatas.get(0).getId());
//            mesMeterHistoryDataDayService.updateById(mesMeterHistoryDataDay);
//        }
//    }
//
//    /**
//     * 获取某日的出始电量。今日的初始电量实际是昨天的最后一条电量
//     * @param date 昨天的日期
//     * @param tableName
//     * @return
//     */
//    private BigDecimal getInitialWh(String date, String tableName) {
//        List<Map<String, Object>> list = iotElectricityDao.getInitialWh(FIELD_WH,tableName,date);
//
//        if (list.size() == 0) {
//            return null;
//        }
//
//        return new BigDecimal(list.get(0).get(FIELD_WH).toString());
//    }
//
//    /**
//     * 获取所有需要计算的日期
//     * @param tableName
//     * @return
//     */
//    private List<String> getAllDate(String tableName, String today) {
//        // 获取数据
//        Long lastId = getLastId(tableName);
//        if (lastId == null) {
//            lastId = 0L;
//        }
//        List<Map<String, Object>> list = iotElectricityDao.getAllDate(tableName, lastId);
//
//
//        // 创建一个存储日期的列表
//        List<String> dateRange = new ArrayList<>();
//        if (list.size() == 0) {
//            return dateRange;
//        }
//
//        String firstDate = list.get(0).get("Date").toString();
//        String lastDate = today;
//
//        // 解析日期字符串
//        LocalDate startDate = LocalDate.parse(firstDate);
//        LocalDate endDate = LocalDate.parse(lastDate);
//
//
//        // 计算并添加所有日期
//        LocalDate currentDate = startDate;
//        while (!currentDate.isAfter(endDate)) {
//            dateRange.add(currentDate.toString());
//            currentDate = currentDate.plusDays(1);
//        }
//
//        dateRange.forEach(date-> {
//            System.out.println(date);
//        });
//
//        return dateRange;
//    }
//
//    private void saveLastId(String tableName,Long lastId) {
//        MeterMaxid meterMaxid = new MeterMaxid();
//        meterMaxid.setTableName(tableName);
//        meterMaxid.setLastId(lastId);
//        meterMaxidService.saveOrUpdate(meterMaxid,new LambdaUpdateWrapper<MeterMaxid>()
//                .eq(MeterMaxid::getTableName,tableName));
//    }
//
//    private Long getLastId(String tableName) {
//        MeterMaxid one = meterMaxidService.getOne(new LambdaQueryWrapper<MeterMaxid>().eq(MeterMaxid::getTableName, tableName));
//        if (null == one) {
//            return null;
//        }
//        return one.getLastId();
//    }
//
//    /**
//     * 获取所有电表对应的数据存储表
//     * @return
//     */
//    private Set<String> getAllTableName() {
//        List<Map<String, Object>> tables = iotElectricityDao.getAllTableName();
//
//        Set<String> tableNameSet= new HashSet<>();
//
//        tables.forEach(map-> {
//            if (map == null) {
//                return;
//            }
//            if (map.get("history_table_name") == null || StringUtils.isEmpty(map.get("history_table_name").toString())) {
//                return;
//            }
//            String historyTableName = map.get("history_table_name").toString();
//            List<Map<String, Object>> tableExists = historyDataDao.checkTableExists(historyTableName);
//            if (tableExists.size() != 0) {
//                tableNameSet.add(map.get("history_table_name").toString());
//            }
//        });
//        return tableNameSet;
//    }
}
